package songZhao.MinaDemo.IObuffer;

import java.nio.charset.CharacterCodingException;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;
import java.nio.charset.CharsetEncoder;

import org.apache.mina.core.buffer.IoBuffer;
/**
 * 尝试下读取各种数据类型攒成的一个buffer,看看是不是回出现解码的一些问题.
 * @author Administrator
 *
 */
public class TestBuffer {
	public static void main(String[] args) throws CharacterCodingException {
		Charset charset = Charset.forName("UTF-8");
		CharsetEncoder encoder = charset.newEncoder();
		CharsetDecoder decoder = charset.newDecoder();

		IoBuffer buffer = IoBuffer.allocate(1024);
		buffer.setAutoExpand(true);

		System.out.println(Integer.MAX_VALUE);
		buffer.putInt(0);
		buffer.put((byte) 127);
		buffer.putString("this is number one", encoder);
		buffer.putInt(1);
		buffer.putString("####this is number two", encoder);
		buffer.putInt(2);
		buffer.putString("this is number three", encoder);
		buffer.put((byte) 127);
		buffer.putInt(11111);
		buffer.putString("this is number four", encoder);
		buffer.put((byte) 127);
		buffer.putInt(Integer.MAX_VALUE);
		buffer.flip();

		/**
		 * 注意下边,当数字,字节,字符串之间的一些有趣的现象. 总之就是,读取字符串的时候,总会多读一个字节.
		 */
		System.out.println(buffer.getInt());
		System.out.println(buffer.get());
		System.out.println(buffer.getString(decoder));
		buffer.position(buffer.position() - 1);
		System.out.println(buffer.getInt());
		System.out.println(buffer.getString(decoder));
		buffer.position(buffer.position() - 1);
		System.out.println(buffer.getInt());
		/*
		 * 最后一行因为,在放入字符串后,又放入了一个表示127数字的字节, 读取字符串的时候,就连带这个表示127的字节连带读取了,所以
		 * 第三次输出字符串的时候,最后一个字符,会打印出比较好玩的结果.比如乱码 如果想正确读取字符串之后的其他数据,需要回退一个字节
		 * 
		 * 还有就是不要再两次字符串中间加入一个字节的其他数据, 因为这两个字符串会被一次取出
		 */
		System.out.println(buffer.getString(decoder));

		buffer.position(buffer.position() - 2);
		System.out.println(buffer.get());
		System.out.println(buffer.getInt());
		/**
		 * 这里试图读取第四行的字符串就会出现问题. 
		 * 这里想要说明的问题时,iobuffer并不适合写入这些复杂的数据.
		 * java.nio.charset.MalformedInputException
		 * 如果要编写一个buffer,所谓数据包来进行传输,那么字符串的内容尽量的写入到最后的部分.
		 */
		System.out.println(buffer.getString(decoder));
		buffer.position(buffer.position() - 2);
		System.out.println(buffer.get());
		System.out.println(buffer.getInt());

	}
}
